/**
 * 动态路由工具
 * 将菜单数据转换为路由配置
 */

/**
 * 将菜单数据转换为路由配置
 * @param {Array} menus 菜单数据
 * @returns {Array} 路由配置
 */
export const generateRoutes = (menus) => {
  const routes = []

  // 递归处理菜单数据
  const processMenu = (menu) => {
    const route = {
      path: menu.path,
      name: menu.name,
      meta: {
        title: menu.name,
        requiresAuth: true,
        permission: menu.permission
      }
    }

    // 处理组件
    if (menu.type === 1) {
      // 目录类型，使用布局组件
      route.component = () => import('/src/layouts/MainLayout.vue')
      // 修正重定向路径，确保是完整路径
      let redirectPath = '/dashboard'
      if (menu.children && menu.children.length > 0) {
        const firstChild = menu.children[0]
        // 构造完整路径
        redirectPath = menu.path + (menu.path.endsWith('/') ? '' : '/') + (firstChild.path.startsWith('/') ? firstChild.path.substring(1) : firstChild.path)
      }
      route.redirect = redirectPath
    } else if (menu.component) {
      // 菜单类型，动态导入组件
      const componentName = menu.component

      try {
        // 使用Vite的glob导入方式，匹配所有.vue文件（包括子目录）
        const components = import.meta.glob('@/views/**/*.vue', { eager: false })

        // 尝试直接路径（注意：import.meta.glob会将@转换为/src）
        let componentPath = `/src/views/${componentName}.vue`
        // 检查直接路径
        if (components[componentPath]) {
          route.component = components[componentPath]
        } else {
          // 尝试在所有组件路径中查找匹配项
          const matchedPath = Object.keys(components).find(path => {
            // 提取文件名（不含扩展名）
            const fileName = path.split('/').pop().replace('.vue', '')
            return fileName === componentName
          })

          if (matchedPath) {
            route.component = components[matchedPath]
          } else {
            // 如果未找到，使用404组件
            route.component = () => import('/src/views/404.vue')
          }
        }
      } catch (error) {
        // 如果发生异常，使用404组件
        route.component = () => import('/src/views/404.vue')
      }
    }

    // 处理子菜单
    if (menu.children && menu.children.length > 0) {
      route.children = menu.children
        .filter(child => child.type !== 3) // 过滤掉按钮类型
        .map(child => {
          // 保留子菜单的原始路径，不做修改
          const childMenu = { ...child }
          return processMenu(childMenu)
        })
    }

    return route
  }

  // 处理顶级菜单
  menus.forEach(menu => {
    if (menu.type !== 3) { // 过滤掉按钮类型
      const route = processMenu(menu)
      // 确保顶级路由有正确的路径结构
      if (route.path.startsWith('/')) {
        routes.push(route)
      } else {
        // 如果路径不以/开头，添加/
        route.path = '/' + route.path
        routes.push(route)
      }
    }
  })

  return routes
}

/**
 * 过滤用户有权限的路由
 * @param {Array} routes 所有路由
 * @param {Array} permissions 用户权限
 * @returns {Array} 有权限的路由
 */
export const filterAsyncRoutes = (routes, permissions) => {
  const res = []

  routes.forEach(route => {
    const tmp = { ...route }

    // 检查路由权限
    if (hasPermission(tmp, permissions)) {
      // 处理子路由
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, permissions)
      }
      res.push(tmp)
    }
  })

  return res
}

/**
 * 检查路由权限
 * @param {Object} route 路由对象
 * @param {Array} permissions 用户权限
 * @returns {Boolean} 是否有权限
 */
const hasPermission = (route, permissions) => {
  if (route.meta && route.meta.permission) {
    return permissions.includes(route.meta.permission)
  } else {
    return true // 没有权限要求的路由默认允许访问
  }
}

/**
 * 添加动态路由到路由器
 * @param {Object} router 路由器实例
 * @param {Array} asyncRoutes 动态路由
 */
export const addAsyncRoutes = (router, asyncRoutes) => {
  asyncRoutes.forEach(route => {
    // 添加路由到路由器
    router.addRoute(route)

    // 如果有子路由，也添加子路由
    if (route.children && route.children.length > 0) {
      route.children.forEach(child => {
        // 直接使用相对路径添加子路由
        router.addRoute(route.name, child)
      })
    }
  })

  // 重新添加404路由以确保它在路由表的最后
  router.addRoute({
    path: '/:pathMatch(.*)*',
    name: 'NotFound',
    component: () => import('/src/views/404.vue'),
    meta: { title: '404' }
  })
}